#ifndef SYSTEM_PARAM_H
#define SYSTEM_PARAM_H

#include "./cot_param/cot_param.h"

/**
 * @brief 十六进制数据打印宏
 * @param str 打印标识字符串
 * @param hex 待打印的十六进制数据
 * @param len 数据长度
 */
#define HEX_PRINTF(str, hex, len)     \
    printf("%s: [%d] -> ", str, len); \
    for (int i = 0; i < (len); i++)   \
    {                                 \
        printf("%02x ", hex[i]);      \
    }                                 \
    printf("\n");

/* 显示界面配置 */
typedef struct
{
    uint8_t direction;    /* 屏幕方向: 0-0度, 1-180度, 2-90度, 3-270度 */
    uint8_t brightness;   /* 屏幕亮度: 取值范围 20-100 */
    uint8_t language;     /* 系统语言: 0-中文, 1-英文 */
} DisplayParam_t;

/* PWM生成器参数配置 */
typedef struct
{
    uint16_t frequency;   /* PWM频率: 取值范围 5-10000Hz */
    uint8_t dutyCycle;    /* PWM占空比: 取值范围 1-99% */
} PWMGeneratorParam_t;

/* 正弦波生成器参数配置 */
typedef struct
{
    uint16_t frequency;   /* 正弦波频率: 取值范围 1-30000Hz */
    uint16_t amplitude;   /* 正弦波幅值: 取值范围 100-2048 */
    uint16_t phase;       /* 正弦波相位: 取值范围 0-360度 */
} SineWaveParam_t;

/* 全局参数实例声明 */
extern DisplayParam_t g_tDisplayParam;
extern PWMGeneratorParam_t g_tPWMParam;
extern SineWaveParam_t g_tSineWaveParam;

/* 参数管理函数 */
void InitParam(bool isReset);     /* 初始化参数管理器，isReset:是否重置参数 */
void ReloadParam(bool isReset);   /* 从存储设备重新加载参数，isReset:是否在加载前进行参数校验 */
void SaveParam(bool isReset);     /* 保存参数到存储设备，isReset:是否在保存前进行参数校验 */
void ResetParam(void);            /* 重置所有参数为默认值 */

void ApplyDisplaySettings(void);  /* 应用显示设置（屏幕方向、亮度和系统语言） */

int SingleParamCheckProcess(const void *pCurParam, cotParamResetOpt_e eResetOpt);   /* 单个参数校验处理，返回0成功 */
cotParamCheckRet_e SingleParamCheck(const void *pCurParam, const void *pCheckValue);/* 检查单个参数值是否合法 */
cotParamCheckRet_e SingleParamSelfCheck(const void *pCurParam);                     /* 单个参数自检 */
void SingleParamResetResetDefValue(const void *pCurParam);                          /* 重置单个参数为默认值 */
void SingleParamChange(const void *pCurParam, ...);                                 /* 修改单个参数值 */
void ShowAllParam(void);                                                            /* 显示所有参数信息 */

int SaveSingleParamByAddr(const void *pParam);  /* 通过参数地址保存单个参数，返回0成功 */
int LoadSingleParamByAddr(const void *pParam);  /* 通过参数地址加载单个参数，返回0成功 */

/* 参数信息获取函数 */
const cotParamInfo_t* GetParamInfo(const void* pParam);  /* 获取参数信息，返回参数信息结构体指针 */

#endif
